package cn.feizhu.aimarket.ai.workflow.node;

import cn.feizhu.aimarket.ai.workflow.model.constant.WorkflowControlConstant;
import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.action.NodeAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.client.ChatClient;

import java.util.Map;

/**
 * 指令处理节点
 * 处理用户指令，分析需求并为大纲生成做准备
 *
 * @author feizhu
 * @since 2025/10/16
 */
public class CommandProcessNode implements NodeAction {

    private static final Logger logger = LoggerFactory.getLogger(CommandProcessNode.class);

    private final ChatClient chatClient;



    public CommandProcessNode(ChatClient commandProcessClient) {
        this.chatClient = commandProcessClient;
    }

    @Override
    public Map<String, Object> apply(OverAllState state) {
        logger.info("=== 指令处理节点开始执行 ===");

        try {
            // 获取用户输入
            String userInput = (String) state.value(WorkflowControlConstant.USER_INPUT)
                    .orElse("");
            // TODO 可以把之前生成的大纲，如果有的话也添加进来
            // 这里获取到返回的feedback结果
            String feedback = state.value(WorkflowControlConstant.FEEDBACK)
                    .orElse("").toString();

            logger.info("处理用户指令: {},feedback: {}", userInput,feedback);

            String prompt = """
                    请分析用户的指令需求，提取关键信息并生成适合大纲生成的指令内容。
                    用户指令: {user_input}
                    反馈信息: {feedback}
                    """.replace("{user_input}", userInput)
                    .replace("{feedback}", feedback);

            // 使用AI分析用户指令 TODO 后期可以用这套
            String processedCommand = chatClient.prompt()
                    .user(prompt)
                    .call()
                    .content();

            logger.info("指令处理结果: {}", processedCommand);

            // 将处理结果存储到状态中，供后续节点使用
            return Map.of("processed_command", processedCommand);

        } catch (Exception e) {
            logger.error("指令处理节点执行异常", e);
            return Map.of("processed_command", "指令处理失败：" + e.getMessage());
        } finally {
            logger.info("=== 指令处理节点执行完成 ===");
        }
    }
}
